package com.hok.misc.file;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang.ArrayUtils;

public class FileUtils {
	private static final File[] EMPTY_FILES = new File[0];
	
	//.svn文件过滤
	public static final FileFilter SVN_FILTER = new FileFilter() {
		public boolean accept(File pathname) {
			return !pathname.getName().startsWith(".");
		}
	};
	
	
	/**
	 * 得到文件的扩展名（小写如果没有则返回空字符串）
	 * 
	 * @param fileName
	 * @return
	 */
	public static String getExtName(String fileName) {
		int pos = fileName.lastIndexOf(".");
		if (pos > -1) {
			return fileName.substring(pos + 1).toLowerCase();
		} else {
			return "";
		}
	}
	
	
	/**
	 * 列出符合扩展名条件的全部文件
	 * 
	 * @param file
	 * @param extnames
	 * @return
	 */
	public static File[] listFiles(File file, final String... extnames) {
		File[] r = file.listFiles(new FileFilter() {
			public boolean accept(File f) {
				boolean isAll = extnames.length == 0;
				if (f.isFile() && (isAll || ArrayUtils.contains(extnames, getExtName(f.getName())))) {
					return true;
				}
				return false;
			}
		});
		return r == null ? EMPTY_FILES : r;
	}
	
	/**
	 * 递归列出指定目录下的文件（不含文件夹）
	 * 
	 * @param file
	 * @param extnames
	 *            允许列出的扩展名，必须小写，不含.号
	 * @return
	 */
	public static File[] listFilesRecursive(File file, final String... extnames) {
		List<File> files = new ArrayList<File>();
		for (File folder : listFolders(file)) {
			files.addAll(Arrays.asList(listFilesRecursive(folder, extnames)));
		}
		files.addAll(Arrays.asList(listFiles(file, extnames)));
		return files.toArray(new File[files.size()]);
	}
	
	/**
	 * 列出指定目录下的文件夹
	 * 
	 * @param file
	 * @return
	 */
	public static File[] listFolders(File file) {
		File[] r = file.listFiles(new FileFilter() {
			public boolean accept(File f) {
				if (f.isDirectory()) {
					return true;
				}
				return false;
			}
		});
		return r == null ? EMPTY_FILES : r;
	}
	
	/**
	 * 递归列出所有文件夹
	 * @param file
	 * @return
	 */
	public static File[] listFoldersRecursive(File file,final FileFilter filter) {
		List<File> files = new ArrayList<File>();
		for (File folder : listFolders(file)) {
			if(filter.accept(folder)){
				files.add(folder);
				files.addAll(Arrays.asList(listFoldersRecursive(folder,filter)));	
			}
		}
		return files.toArray(new File[files.size()]);
	}
}
